package com.cskaoyan.javase.oop1._5this;

/**
 * 引例:
 * 学习完对象与类后，做以下练习：
 * 创建一个汽车类，有颜色（color）和速度（speed）两个属性，行为是可以跑（run）。
 *
 * 实现：
 * 在run成员方法中访问速度和颜色两个属性，调用该方法查看结果。
 * 在run成员方法的形参列表中，添加一个局部变量speed，不修改方法体，调用该方法查看结果。
 * 思考：
 * 两次方法调用的结果一样吗？为什么？
 * 如果我想在2中得到1的访问结果，怎么办呢？
 *
 * 如果成员方法的形参名和类中的成员变量名一致了,两个都能匹配时,依据就近原则,这时会使用形参的变量
 * 这时如果我就想访问同名成员变量的取值,那怎么办?
 * 于是需要使用this关键字
 * -------------------------------------------------------------------------------------------------------
 * this关键字:
 * 在java类中,所有的成员方法的形式参数列表中,都隐含了一个传参(隐式传参),传入的是当前对象,这个对象用this来接收
 * 每个成员方法中都隐含了一个传参——当前对象，这个对象用this引用接收
 * 何为当前对象呢？
 * 成员方法想要执行，必须被调用，而想被调用，必须用对象名点，需要一个对象来调用它
 * 所以哪个对象来调用成员方法，那么它就是当前对象
 *
 * 理解了this后，那么如何在成员方法中访问同名的成员变量呢？
 * 用this.去访问同名成员变量即可
 *
 * this关键字的用途：
 *      1.在成员方法中，用来区分同名的成员变量和局部变量
 *      2.在成员方法中，正是因为隐含了this传参指向了当前对象，
 *          所以成员方法中可以直接访问对象的成员变量和成员方法
 *          当然在一般情况下，没有必要写出this，因为它是隐式传参。只有同名时，为了区分才需要写出this
 *      3.static方法不是成员方法，它是没有this传参
 *          ---> 所以static方法中不能直接访问对象的成员变量和成员方法
 *          当然不是说不能访问，如果想要访问，需要创建对象，然后用对象名访问
 *      4.this有时候也可以用来增加代码可读性（只有当代码比较复杂时才有必要）
 *      5.未完待续，，this的用途很多
 *
 * @since 14:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*Car c = _1new Car();
        // c.run();
        c.run(100);
        System.out.println(c);*/

        Car c2 = new Car();
        c2.speed = 180;
        c2.run(200);
    }
}

class Car {
    String color = "黑色";
    double speed = 120;

    public void run(double speed) {
        // 直接打印this引用
        System.out.println(this);
        System.out.println(color);
        this.test();
        System.out.println(color + "的小汽车,以" + this.speed + "的速度嘟嘟嘟的在马路上行驶!");
    }
    public void test(){}

    public static void testStatic(){
        // System.out.println(color);
        Car c = new Car();
        c.test();
        System.out.println(c.speed);
    }
}
